home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / 3DDEMO.ZIP / 3D / SOURCE / VOXEL.CPP < prev    next >
C/C++ Source or Header  |  1996-07-16  |  7KB  |  252 lines

  1. #include "voxel.hpp"
  2.  
  3. // Copyright (c) 1996 by Kerrigan Burgess, all rights reserved.
  4.  
  5. VOXELCLASS::VOXELCLASS(void)            // Constructor
  6. {
  7.   int count;                            // setup math tables in 9:23 cos,sin format.
  8.   float ang;
  9.   double ANG;
  10.  
  11.   ang=0;
  12.   for (count=0;count<ANGLE_360;count++)
  13.   {
  14.     ANG=-ang*DEGREES_TO_RADIANS;
  15.  
  16.     COS[count]=cos(ANG)*65536*128;         // put in 23 point format.
  17.     SIN[count]=sin(ANG)*65536*128;
  18.     ang+=ANGULAR_INCREMENT;
  19.   }    
  20.  
  21.   Yaw=ANGLE_90;                        // start facing here
  22.   Altitude=(400<<16);
  23.   Pitch=DEFAULTPITCH;
  24.   Speed=DEFAULTSPEED;
  25.   viewpoint_x=128<<23;
  26.   viewpoint_y=128<<23;
  27.  
  28.   _SKYHEIGHT = SKYHEIGHT;
  29.  
  30. }
  31.  
  32. VOXELCLASS::~VOXELCLASS(void)           // Destructor
  33. {
  34.  
  35.   if (_ShadowPAL != NULL)
  36.     delete _ShadowPAL;     
  37.   if (ShadowCenter != NULL)
  38.     delete ShadowCenter;
  39.   if (ShadowLeft != NULL)
  40.     delete ShadowLeft;
  41.   if (ShadowRight != NULL)
  42.     delete ShadowRight;
  43.   if (_Skymap != NULL)
  44.     delete _Skymap;
  45.   if (_Colormap != NULL)
  46.     delete _Colormap;
  47.   if (_Heightmap != NULL)
  48.     delete _Heightmap;  
  49.   
  50. }
  51.  
  52. void VOXELCLASS::CreateDataBase(VIDEOCLASS *Video)
  53. {
  54.   FILE *fptr;
  55.   char buffer[30],texturemap[30];
  56.  
  57.   _ShadowPAL = new unsigned char [ sizeof(char)*256*2 ];  // 2 colors
  58.   if (_ShadowPAL==NULL)
  59.     Error("Not enough memory\n");
  60.   fptr=fopen("data/shadow.pal","rb");
  61.   if (fptr==NULL)
  62.     Error("Couldn't load Shadow palette\n");
  63.  
  64.   fread((void *)buffer,sizeof(char),27,fptr);      // header.
  65.   fread((void *)texturemap,sizeof(char),30,fptr);  
  66.   fread((void *)_ShadowPAL,sizeof(unsigned char),256*2,fptr);
  67.   
  68.   fclose(fptr);
  69.   
  70.   // Load in Shadow maps.
  71.  
  72.   ImageStats *FileStats;
  73.   unsigned char *bitmap;
  74.  
  75.   bitmap = Video->LoadPcxFile("images/shmask.pcx");     // get pointer to pcx file.
  76.   FileStats  = Video->GetStats();                // get info on file.
  77.  
  78.   ShadowCenter = new unsigned char [ sizeof(char)*FileStats->size ];
  79.   if (ShadowCenter==NULL)
  80.     Error("Not enough memory\n");    
  81.   memcpy(ShadowCenter,bitmap,FileStats->size);
  82.   bitmap = Video->LoadPcxFile("images/shmaskl.pcx");     // get pointer to pcx file.
  83.   FileStats  = Video->GetStats();                // get info on file.
  84.  
  85.   ShadowLeft = new unsigned char [ sizeof(char)*FileStats->size ];
  86.   if (ShadowLeft==NULL)
  87.     Error("Not enough memory\n");    
  88.   memcpy(ShadowLeft,bitmap,FileStats->size);
  89.   bitmap = Video->LoadPcxFile("images/shmaskr.pcx");     // get pointer to pcx file.
  90.   FileStats  = Video->GetStats();                // get info on file.
  91.  
  92.   ShadowRight = new unsigned char [ sizeof(char)*FileStats->size ];
  93.   if (ShadowRight==NULL)
  94.     Error("Not enough memory\n");    
  95.   memcpy(ShadowRight,bitmap,FileStats->size);
  96.   _ShadowmapPtr=ShadowCenter;   // default to center mask.
  97.  
  98.   // Load in Regular maps.
  99.   
  100.   long count;
  101.                         // LOAD IN CLOUDMAP
  102.   bitmap = Video->LoadPcxFile("images/clouds.pcx");     // get pointer to pcx file.
  103.   FileStats  = Video->GetStats();                // get info on file.
  104.  
  105.   _Skymap = new unsigned char [ sizeof(char)*FileStats->size ];
  106.   if (_Skymap==NULL)
  107.     Error("Not enough memory\n");
  108.   memcpy(_Skymap,bitmap,FileStats->size);
  109.   
  110.                         // LOAD IN COLORMAP
  111.   bitmap = Video->LoadPcxFile("images/democ.pcx");     // get pointer to pcx file.
  112.   FileStats  = Video->GetStats();                // get info on file.
  113.  
  114.   _Colormap = new unsigned char [ sizeof(char)*FileStats->size ];
  115.   if (_Colormap==NULL)
  116.     Error("Not enough memory\n");
  117.   memcpy(_Colormap,bitmap,FileStats->size);
  118.   
  119.   Video->SetAllRgbPalette();
  120.  
  121.                         // LOAD IN HEIGHTMAP                
  122.   bitmap = Video->LoadPcxFile("images/demoh.pcx");     // get pointer to pcx file.
  123.   FileStats  = Video->GetStats();                // get info on file.
  124.  
  125.   _Heightmap = (long *)calloc(1,(sizeof(long)*FileStats->size));
  126.   if (_Heightmap==NULL)
  127.     Error("Not enough memory\n");
  128.  
  129.   // WATCOM is weired sometimes. I want 1 meg of memory but if I call
  130.   // new it doesn't give it to me (NULL). But if I call calloc manually,
  131.   // how come I get the memory?
  132.  
  133.   for (count=0;count< (FileStats->size) ;count++)
  134.     _Heightmap[count] = bitmap[count]<<16;     // multiply by 65536 to get 16:16 fixed
  135. }
  136.  
  137. void VOXELCLASS::RenderSky()
  138. {
  139.   int leftangle,rightangle;
  140.  
  141.   leftangle=(Yaw-ANGLE_30)&ANGLE_MASK;
  142.   rightangle=(Yaw+ANGLE_30)&ANGLE_MASK;
  143.  
  144.   _SkyHoriz=Pitch+25;
  145.   
  146.   _vx=viewpoint_x>>7;              // put in 16:16 format.
  147.   _vy=viewpoint_y>>7;
  148.  
  149.   _LeftCos  = COS[leftangle]>>15;
  150.   _LeftSin  = SIN[leftangle]>>15;
  151.   _RightCos = COS[rightangle]>>15;
  152.   _RightSin = SIN[rightangle]>>15;
  153.  
  154.   _SkyLimit=_SkyHoriz;
  155.   
  156.   if (_SkyLimit>SCREENHEIGHT)
  157.     _SkyLimit=SCREENHEIGHT;
  158.  
  159.   if (_SkyLimit>0)        // only call if some sky to see
  160.     RenderSkyLine();      
  161. }
  162.  
  163. void VOXELCLASS::RenderView(unsigned char *DoubleBuffer)
  164. {
  165.   int angle;
  166.   float Resolution;
  167.  
  168.   _Buffer = DoubleBuffer;         // make buffer visible to assembly module.
  169.   
  170.   RenderSky();
  171.  
  172.   angle=(Yaw-ANGLE_30)&ANGLE_MASK;
  173.   Resolution = (Altitude>>16)*(0.01);    // The higher we go --> reduce resolution (see farther).
  174.  
  175.   if (Resolution<1.0)                    // If too close to ground move by small (unit steps).
  176.     Resolution=1.0;
  177.       
  178.   _kVScale = Resolution*KVSCALE;          // if you go higher move in greater unit steps.
  179.  
  180.   for ( _col=0; _col<SCREENWIDTH; _col++)
  181.   {
  182.      _x=viewpoint_x;
  183.      _y=viewpoint_y;
  184.      _z=Altitude;
  185.      _dx=( COS[angle]*Resolution  );
  186.      _dy=( SIN[angle]*Resolution  );
  187.      _dz=( Pitch-(SCREENHEIGHT-1) )*_kVScale;
  188.      CastRay();
  189.      angle=(angle+1)&ANGLE_MASK;
  190.   }
  191. }
  192.  
  193. void VOXELCLASS::CheckCrashed(void)
  194. {
  195.   int Height;
  196.  
  197.   Height=_Heightmap[ GetOffset(viewpoint_x,viewpoint_y) ];
  198.  
  199.   if (Altitude>MAXALTITUDE)
  200.     Altitude=MAXALTITUDE;
  201.   else
  202.   if (Altitude<MINALTITUDE)
  203.     Altitude=MINALTITUDE;
  204.  
  205.   if (Height>Altitude)
  206.   {
  207.      Altitude = Height;
  208.      Pitch += PITCHSPEED;
  209.   }
  210. }
  211.   
  212. void VOXELCLASS::HandleInput(INPUTCLASS *Input)
  213. {         
  214.    if (Input->Is_Key(SCAN_LEFT))
  215.    {
  216.      Yaw=(Yaw-YAWACCEL)&ANGLE_MASK;
  217.      _ShadowmapPtr=ShadowLeft;
  218.    }
  219.    else
  220.    if (Input->Is_Key(SCAN_RIGHT))
  221.    {
  222.      Yaw=(Yaw+YAWACCEL)&ANGLE_MASK;
  223.      _ShadowmapPtr=ShadowRight;
  224.    }
  225.    else
  226.    {
  227.      _ShadowmapPtr=ShadowCenter;
  228.    }
  229.  
  230.    if (Input->Is_Key(SCAN_UP))
  231.      Pitch-=PITCHSPEED;
  232.    else
  233.    if (Input->Is_Key(SCAN_DOWN))
  234.      Pitch+=PITCHSPEED;
  235.    else
  236.    {
  237.      if (Pitch<DEFAULTPITCH)
  238.        Pitch++;
  239.      else
  240.      if (Pitch>DEFAULTPITCH)
  241.        Pitch--;
  242.    }
  243.  
  244.    viewpoint_x+=VIEWSPEED*COS[Yaw];
  245.    viewpoint_y+=VIEWSPEED*SIN[Yaw];
  246.  
  247.    Altitude+=(Speed*(Pitch-DEFAULTPITCH));
  248.  
  249.    CheckCrashed();                            
  250. }
  251.  
  252.